<?php

namespace Agi\Config;


/**
 * 邮箱配置
 *
 * @package Agi\Config
 * @author  Janpoem created at 2015/3/11 6:36
 *
 * @property string $host     smtp服务器
 * @property int    $port     smtp端口号
 * @property string $smtp     smtp安全协议
 * @property string $username 用户名
 * @property string $password 密码
 * @property bool   $isDebug  是否调试
 * @property string $fromMail 发送者显示的邮箱
 * @property string $fromName 发送者显示的名称
 */
class Mail extends Config
{

    /** 不使用安全协议 */
    const NO_SECURE = 'none';

    /** SSL 协议 */
    const USE_SSL = 'ssl';

    /** TLS 协议 */
    const USE_TLS = 'tls';

    /** @var string 邮箱配置的前缀 */
    protected static $namespace = 'mail';

    /** @var array 默认的数据规格 */
    protected static $defaultData = array(
        'host'     => null,
        'port'     => 25,
        'smtp'     => self::NO_SECURE,
        'username' => null,
        'password' => null,
        'isDebug'  => false,
        'fromMail' => null,
        'fromName' => null,
    );

    /** @var array SMTP 的端口列举 */
    protected $smtpPorts = array(
        self::NO_SECURE => 25,
        self::USE_SSL   => 465,
        self::USE_TLS   => 587,
    );

    /**
     * 数据过滤
     *
     * @override
     *
     * @param array $data
     *
     * @return array
     */
    public function filterData(array $data)
    {
        // 确保smtp协议为可识别的协议
        if (!isset($data['smtp']) || ($data['smtp'] !== self::USE_SSL && $data['smtp'] !== self::USE_TLS))
            $data['smtp'] = self::NO_SECURE;

        // 确保端口号为有效的数字
        if (!isset($data['port']) || !is_numeric($data['port'])) {
            // port不是有效的数字，则根据smtp字段的设置取得默认的端口号
            $data['port'] = $this->smtpPorts[$data['smtp']];
        } else {
            $data['port'] = intval($data['port']);
        }

        if (isset($data['from'])) {
            // 如果设置了from，则以from覆盖fromMail和fromName
            list($data['fromMail'], $data['fromName']) = $this->filterFrom($data['from']);
            unset($data['from']);
        }
        return $data + static::$defaultData;
    }

    /**
     * 过滤from字段的数据
     *
     * @todo 暂时只做了字符串的识别，需要添加数组格式的识别
     *
     * @param mixed $from
     *
     * @return array
     */
    public function filterFrom($from)
    {
        $type = gettype($from);
        $mail = null;
        $name = null;
        if ($type === 'string') {
            $split = explode(':', $from);
            // 'abc@123.com'
            if (!isset($split[1])) {
                list($name,) = explode('@', $split[0]);
                $mail = $split[0];
            } // 'name:abc@123.com'
            else {
                $name = $split[0];
                $mail = $split[1];
            }
        }
        return array($mail, $name);
    }
}

 